先说说这些请求头的意思 这是一个 Squid 开发的字段,只有在通过了HTTP代理或者负载均衡服务器时才会添加该项。 X-Real-IP 1、REMOTE_ADDR 2、HTTP_X_FORWARDED_FOR 3、
REMOTE_ADDR 是你的客户端跟你的服务器“握手”时候的IP。如果使用了“匿名代理”,REMOTE_ADDR将显示代理服务器的IP。
$_SERVER['HTTP_X_FORWARDED_FOR']; //用户是在哪个IP使用的代理(有可能存在,也可以伪造
一、没有使用代理服务器的情况: HTTP_X_FORWARDED_FOR = 没数值或不显示 二、使用代理服务器的情况: REMOTE_ADDR = 最后一个代理服务器 IP
/** * 获取客户端ip */ function getClientIP() { $ip = "unknown"; /* * 访问时用localhost访问的,读出来的是“::1”是正常情况。 * ::1说明开启了ipv6支持,这是ipv6下的本地回环地址的表示。 * 使用ip地址访问或者关闭ipv6支持都可以不显示这个。 * */ if (isset($_SERVER)) { if (isset($_SERVER["HTTP_X_FORWARDED_FOR"])) { $ip = $_SERVER["HTTP_X_FORWARDED_FOR"]; } elseif (isset($_SERVER["HTTP_X_REAL_IP"])) { $ip = $_SERVER["HTTP_X_REAL_IP"]; } elseif (isset($_SERVER["HTTP_CLIENT_ip"])) { $ip = $_SERVER["HTTP_CLIENT_ip"]; } else { $ip = $_SERVER["REMOTE_ADDR"]; } } else { if (getenv('HTTP_X_FORWARDED_FOR')) { $ip = getenv('HTTP_X_FORWARDED_FOR'); } elseif (getenv('HTTP_X_REAL_IP')) { $ip = getenv('HTTP_X_REAL_IP'); } elseif (getenv('HTTP_CLIENT_ip')) { $ip = getenv('HTTP_CLIENT_ip'); } else { $ip = getenv('REMOTE_ADDR'); } } if(trim($ip)=="::1"){ $ip="127.0.0.1"; } return $ip; }
在JSP里,获取客户端的IP地址的方法是:request.getRemoteAddr(),这种方法在大部分情况下都是有效的。但是在通过了Apache,Squid等反向代理软件就不能获取到客户端的真实IP地址了。 下面是一个参考获取客户端IP地址的方法:
public String getClientIP(HttpServletRequest request) {
String ip = request.getHeader("x-forwarded-for");
if(ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
ip = request.getHeader("Proxy-Client-IP");
}
if(ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
ip = request.getHeader("WL-Proxy-Client-IP");
}
if(ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
ip = request.getRemoteAddr();
}
return ip;
}
|